FSx for Windows File Serverで「アクセスベースの列挙」(Access-based Enumeration: ABE) を利用する
みなさん、こんにちは!
福岡オフィスの青柳です。
今回は、Amazon FSx for Windows File Serverで「アクセスベースの列挙」 (Access-based Enumeration: ABE) を利用する方法について調べてみました。
「アクセスベースの列挙」とは?
「アクセスベースの列挙」 (Access-based Enumeration: ABE) とは、Windows Server 2003 SP1以降で導入されたWindows Serverの標準機能であり、「共有フォルダー内の全フォルダーではなく、自分がアクセス可能なフォルダーのみを列挙して表示する」機能のことを指します。
・・・これだけだと何だかイメージが湧きませんね。
実例で説明したいと思います。
まず、Active Directoryで以下のようにグループが定義されていて、各ユーザーがドメイングループに所属しているとします。
グループ | 所属するユーザー |
---|---|
G経理部 | testuser01 |
G営業部 | testuser02 |
G開発部 | testuser03 |
ファイルサーバーの共有フォルダー配下に、以下のようなフォルダーを作成します。
フォルダー名 | アクセス権限 |
---|---|
経理部 | G経理部:変更 Domain Admins:フルコントロール |
営業部 | G営業部:変更 Domain Admins:フルコントロール |
開発部 | G開発部:変更 Domain Admins:フルコントロール |
全社共通 | G経理部:変更 G営業部:変更 G開発部:変更 Domain Admins:フルコントロール |
以上の条件下で、各ユーザーがファイルサーバーの共有フォルダーを参照します。
「アクセスベースの列挙」が有効になっていない共有フォルダーの場合、以下のように表示されます。
一方、「アクセスベースの列挙」が有効になっている共有フォルダーの場合、以下のように表示されます。
違いがお分かりになりましたか?
「アクセスベースの列挙」が有効になっていない時は、全てのユーザーから同じようにフォルダーの一覧が見えます。
「アクセスベースの列挙」を有効にすると、自分がアクセス権限を持たないフォルダーは一覧に表示されなくなり、アクセス権限を持つフォルダーのみが表示されるようになります。
このように、「アクセスベースの列挙」機能を使うことによって、以下のような効果を得ることができます。
- 権限の無いフォルダーを見せないことで、ユーザーに余計な興味を持たせなくする
(「機密データ」なんてフォルダーが一覧にあるのを見ると、人間は興味を持ってしまうものです) - 大量のフォルダーが存在する場合に、必要なフォルダーのみ絞って表示されるため、見易くなる
FSx for Windows File Serverで「アクセスベースの列挙」を設定する方法を調べてみた
Windows Serverにおいて「アクセスベースの列挙」を設定する方法を調べると、概ね以下の方法が見つかります。
- (1) 「Access-based Enumeration tools」を使って設定する
- (2) 「サーバーマネージャー」から「共有と記憶域の管理」画面で設定する
- (3) 「サーバーマネージャー」から「ファイルサービスと記憶域サービス」画面で設定する
- (4) PowerShellコマンド「Set-SmbShare」を使用する
(1)は、Windows Server 2003 (SP1) やWindows Server 2003 R2で使われていた方法で、当時はマイクロソフトのWebサイトからツールを入手して実行するのが公式な方法でした。
FSx for Windows File ServerはWindows Server 2016ベースのファイルサーバーですので、このツールは使用できません。
(そもそも既にマイクロソフトのWebサイトからの入手もできなくなっているようです)
(2)は、Windows Server 2008 / 2008 R2で使われていた方法です。
Windows Server 2012以降で「サーバーマネージャー」が大幅に変更になったため、Windows Server 2016ベースのFSx for Windows File Serverでは使用することができません。
(3)は、Windows Server 2012から最新のWindows Server 2022までサーバーマネージャーの仕様は大きく変わっていないので、使えそうですが、、、
FSx for Windows File ServerはWindows Serverベースで動作しているものの、AWSマネージドなサービスであるため、サーバーへ直接RDPなどで接続することができません。
したがって、サーバーマネージャーでFSxの管理を行うためには、他のWindowsサーバーの「サーバーマネージャー」から「サーバーの追加」でFSxを管理対象に追加する必要があると思われます。
実際にやってみました。
結果は、エラーが発生してFSxを管理対象サーバーとして追加することができませんでした。
Windowsファイアウォールを無効にしたり、VPCセキュリティグループで全通信を許可したりしてみましたが、結果は変わりませんでした。
推測ですが、FSx for Windows File Serverは、サーバーマネージャーなどによるリモート管理についても制限が掛けられているのではないかと思われます。
最後の(4)ですが、PowerShellにはWindowsファイル共有 (SMB) を管理するためのコマンドレット群が用意されています。
既存の共有フォルダーの設定を変更するコマンドレットSet-SmbShere
のMicrosoft公式リファレンスを確認すると、-FolderEnumerationMode
というパラメーターについての説明があります。
Specifies which files and folders in the new SMB share will be visible to the users. The acceptable values for this parameter are:
- AccessBased. SMB does not the display the files and folders for a share to a user unless that user has rights to access the files and folders. By default, access-based enumeration is disabled for new SMB shares.
- Unrestricted. SMB displays files and folders to a user even when the user does not have permission to access those items.
つまり、このSet-SmbShere
コマンドレットに-FolderEnumerationMode
パラメーターを指定することで、「アクセスベースの列挙」を有効化したり無効化したりできる訳です。
FSxでは「Set-SmbShare」は使えない → 「Set-FSxSmbShare」を使えばいいじゃない
しかし、FSx for Windows File Serverに対してPowerShellを使ったリモート管理を行う場合、カスタマイズされたPowerShellコマンドレット群である「Amazon FSx CLI」のみが使用可能となっています。
PowerShell でのリモート管理のための Amazon FSx CLI の使用を開始する - Amazon FSx for Windows File Server
「Amazon FSx CLI」で共有フォルダーの設定を行うために用意されているのはSet-FSxSmbShare
コマンドレットです。
このSet-FSxSmbShare
コマンドレットの使用方法をヘルプ (Set-FSxSmbShare -?
) で確認してみたところ、Set-SmbShare
コマンドレットと同様に-FolderEnumerationMode
パラメーターが用意されているようでした。
AWSドキュメントでは-FolderEnumerationMode
パラメーターの使用方法についての記述を見つけることができませんでしたが、恐らくSet-SmbShare
コマンドレットと同じだろうと想定して、試しに使ってみることにしました。
FSx for Windows File Serverで「アクセスベースの列挙」を有効にしてみる
「アクセスベースの列挙」の設定状態の確認
共有フォルダーの「アクセスベースの列挙」の設定を変更する前に、現在の設定がどのようになっているのか確認してみたいと思います。
設定状態の確認にはGet-FSxSmbShare
コマンドレットが使えそうです。
まず、FSx for Windows File Serverファイルシステムの「Windows Remote PowerShellエンドポイント」へ接続してリモートPowerShellセッションを確立します。
PS> $endpoint = 'amznfsxXXXXXXXX.private.example.com' PS> Enter-PSSession -ComputerName $endpoint -ConfigurationName FSxRemoteAdmin -SessionOption (New-PSSessionOption -UICulture en-US) [amznfsxXXXXXXXX.private.example.com]: PS>
Get-FSxSmbShare
コマンドレットを実行します。
[amznfsxXXXXXXXX.private.example.com]: PS> Get-FSxSmbShare Name ScopeName Path Description ---- --------- ---- ----------- D$ AMZNFSXEALBVH1N D:\ Default Share IPC$ * Remote IPC share AMZNFSXEALBVH1N D:\share
FolderEnumerationMode
の設定値が出力されません。
出力結果にSelect-Object
でフィルターを掛けてみましょう。
[amznfsxXXXXXXXX.private.example.com]: PS> Get-FSxSmbShare | Select-Object Name, Path, FolderEnumerationMode Cannot validate argument on parameter 'Property'. The argument "Path" does not belong to the set "ModuleName,Namespace,OutputType,Count,HelpUri,Name,CommandType,ResolvedCommandName,DefaultPar ameterSet,CmdletBinding,Parameters" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again. + CategoryInfo : InvalidData: (:) [Select-Object]、ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Select-Object
エラーになってしまいました。
実は、FSx for Windows File Serverに対してリモートPowerShellセッション接続を行う場合、限定されたFSx管理用のPowerShellコマンドレットしか使用できないのはもちろん、Select-Object
によるフィルター実行などにも制限が掛けられているのです。
詳細は、しばたが執筆した下記ブログ記事を参照してください。
結論を言うと、Get-FSxSmbShare
コマンドレットでFolderEnumerationMode
の設定値を出力するためには、Enter-PSSession
コマンドレットを使う方法ではなく、Invoke-Command
コマンドレットを使う方法を選択する必要があります。
以下のようにコマンドを実行します。
$cred = Get-Credential 'AWSFSxAdmin' # FSx管理者ユーザーを指定 $params = @{ ComputerName = 'amznfsxXXXXXXXX.private.example.com' # Windows Remote PowerShellエンドポイントを指定 Credential = $cred ConfigurationName = 'FSxRemoteAdmin' SessionOption = (New-PSSessionOption -UICulture 'en-US') ScriptBlock = { Get-FSxSmbShare } } Invoke-Command @params | Select-Object Name, Path, FolderEnumerationMode
「Windows PowerShell資格情報の要求」ダイアログがポップアップしますので、FSx管理者ユーザーのパスワードを入力します。
実行結果が以下のように表示されます。
Name Path FolderEnumerationMode ---- ---- --------------------- D$ D:\ 1 IPC$ 1 share D:\share 1
FolderEnumerationMode
の値は以下を示しています。
1
: 「アクセスベースの列挙」は無効 (Unrestricted)0
: 「アクセスベースの列挙」は有効 (AccessBased)
「アクセスベースの列挙」を有効に設定する
それでは、共有フォルダーの「アクセスベースの列挙」を有効に設定しましょう。
前述のSet-FSxSmbShare
コマンドレットを使う訳ですが、ここではEnter-PSSession
コマンドレットを使う方法、Invoke-Command
コマンドレットを使う方法のいずれの方法も使えます。
ここではInvoke-Command
コマンドレットを使ってみます。
$cred = Get-Credential 'AWSFSxAdmin' # FSx管理者ユーザーを指定 $params = @{ ComputerName = 'amznfsxXXXXXXXX.private.example.com' # Windows Remote PowerShellエンドポイントを指定 Credential = $cred ConfigurationName = 'FSxRemoteAdmin' SessionOption = (New-PSSessionOption -UICulture 'en-US') ScriptBlock = { Set-FSxSmbShare -Name 'share' -FolderEnumerationMode AccessBased } } Invoke-Command @params
本当に変更してもよいか確認を求められます。
Confirm Are you sure you want to perform this action? Performing operation 'Modify' on Target 'AMZNFSXxxxxxxxx,share'. [Y] Yes [A] Yes to All [N] No [L] No to All [?] ヘルプ (既定値は "Y"):
「Y」で応答すると、設定が実行されます。
設定を変更した後は、さきほどと同じ方法でGet-FSxSmbShare
コマンドレットを実行して、「アクセスベースの列挙」の設定状態を確認します。
Name Path FolderEnumerationMode ---- ---- --------------------- D$ D:\ 1 IPC$ 1 share D:\share 0
共有フォルダー「share」の「アクセスベースの列挙」が有効 (0
) に設定されたことが確認できました。
これで、ユーザーが共有フォルダー「share」を開いた際に、アクセス権限を持つフォルダーのみが表示されるようになります。
その他の設定手順
既に存在する共有フォルダーの「アクセスベースの列挙」の設定を変更する場合はSet-FSxSmbShare
コマンドレットを使用しましたが、新規に共有フォルダーを作成する際に「アクセスベースの列挙」を有効に設定することもできます。
New-FSxSmbShare
コマンドレットの実行時に-FolderEnumerationMode
パラメーターを指定します。
PS> New-FSxSmbShare -Name 'ShareTest' -Path 'D:\ShareTest' -FullAccess 'Everyone' -FolderEnumerationMode AccessBased
なお、New-FSxSmbShare
コマンドレットを使用して共有フォルダーを作成する際は、-Path
パラメーターで指定するフォルダーを事前に作成しておく必要があることに注意してください。
(管理共有「d$」などを通して作成することになります)
また、共有フォルダーの「アクセスベースの列挙」を無効にするには、以下のように-FolderEnumerationMode Unrestricted
を指定します。
PS> Set-FSxSmbShare -Name 'share' -FolderEnumerationMode Unrestricted
おわりに
コマンドベースでの設定方法にはなりますが、FSx for Windows File Serverでも「アクセスベースの列挙」が利用できることが分かりました。
オンプレミスのWindows Serverファイルサーバーで「アクセスベースの列挙」を利用していて、FSx for Windows File Serverへ移行しても「アクセスベースの列挙」は利用できるのだろうか? 設定はどのようにすればいいのだろうか? と疑問に思っていた方は、参考にしてみてください。